﻿#ifndef PST_TWODHEATMAPSETTINGS_H
#define PST_TWODHEATMAPSETTINGS_H

#include <QTabWidget>
#include "PostEnumType.h"
#include "InfomationCurve2DBasical.h"
// #include "QVBoxLayout.
QT_BEGIN_NAMESPACE
namespace Ui
{
    class TwoDHeatMapSettings;
};
class QTabWidget;
class QListView;
class QComboBox;
class QGridLayout;
class QLineEdit;
class QSpinBox;
class QDoubleSpinBox;
class QStandardItem;
class QCheckBox;
QT_END_NAMESPACE

// class QVBoxLayout;

namespace pst
{
    /// @brief 二维图形的设置UI
    class TwoDHeatMapSettings : public QTabWidget
    {
        Q_OBJECT
    public:
        explicit TwoDHeatMapSettings(QWidget* parent = nullptr, Cure2DType type = Cure2DType::None);
        ~TwoDHeatMapSettings();

    public:
        // 设置画图窗口ID
        void setMainWindowId(int windowId);
        void setWindowUniversalID(int WindowUniversalID) { m_windowUniversalID = WindowUniversalID; }
        /// 选择曲线列表
        void setCurveList(const QList<QString>& curveList);
        QStandardItem* addCurveToList(const QString& curveName);
        void clearCurveList();

        /// 设置固定值和变量值列表， 名字和数字；选择固定值，剩下的就是变量值
        void setFixedVariableValue(const QList<QPair<QString, QList<QString>>>& fixedValueList);
        void setCurrentFixedValueIndex(int index);
        int getCurrentVariableValueIndex() const;
        // 只进行界面布局，不进行数据更新。
        void updateUILayout();

        void setCategaryData(const QList<QString>& categaryList);
        QList<QString> getCategaryData() const;

        // 隐藏曲线属性面板 page1上除了最上面曲线名部分
        void hideCurvePropertylPanel();
        void setCurvePropertyPanelState(const Info2DPointer& info);

        // 设置控制面板是否可编辑
        void setControlPanelEditable(bool editable);

        QStandardItemModel* getCurveNameModel();
        QListView* getCurveNameListView();

        // 设置控制面板是否为动画状态，动画状态下不可编辑
        void setControlPlaneToAnimationState(bool isAnimationState);

        // 脚本中转
        void secondVariableAxisChanged(int index);
        void variableAxisChanged(int index);
        void curveNameCheckStateChanged(int index, bool checked);
        void fixedValueChanged(QList<int> indexList);
        void setDataOprationChanged(bool isLoged, bool isNormalized);
        void setResultValueDataChanged(int index);
        void complexPartsChanged(bool isAmplitudeChecked, bool isPhaseChecked, bool isRealPartChecked, bool isImaginaryPartChecked);
        void removeSelectedGraph();
        void renameFinished(QString name);

    private:
        QString getFontFamilyString(const QString& font);

        void addTopTabPivotUI();
        void addCurveListUI();
        void addVariableAxistUI();
        void setFixedValue();
        void setVariableValue();
        void addFiexedValueToUI();
        void setCategoryData();
        void setDataOptrationUI();

        // page2
        void addXAxisSettingUI();
        void addYAxisSettingUI();

        void addCurvePropertyUI();
        void addLegendPropertyUI();

        void disconnectSignals();
        void connectSignals();
        void hideComponents();

        int getResultDataComponent();
        void DisableComponentCombox();

    signals:
        void signal_displayDataChanged();  // 更新选择的曲线数据
        void signal_axisPropertyChanged(); // 更新坐标轴属性

        void signal_XAxisTitleNameChanged(const QString& titleName);
        void signal_XAxisTitleFontFamilyChanged(const QString& fontFamily);
        void signal_XAxisTitleFontSizeChanged(int fontSize);
        void signal_XAxisMinValueChanged(double minValue);
        void signal_XAxisMaxValueChanged(double maxValue);
        void signal_XAxisStepValueChanged(double step);

        void signal_YAxisTitleNameChanged(const QString& titleName);
        void signal_YAxisTitleFontFamilyChanged(const QString& fontFamily);
        void signal_YAxisTitleFontSizeChanged(int fontSize);
        void signal_YAxisMinValueChanged(double minValue);
        void signal_YAxisMaxValueChanged(double maxValue);
        void signal_YAxisStepValueChanged(double step);

        // 当前曲线修改了数据后，重新进行绘图
        void signal_updateCurveData(const QList<int> selectedCurveInfoIDList,
                                    const int changedInfoID, const QVector<int>& otherKeyIndex = QVector<int>());
        // 更改了扫描参数后，产生一个新图，并添加新参数曲线， 然后重新绘图
        void signal_generateANewGraphCurve(const QModelIndexList& itemList,
                                           const Info2DPointer& changedInfo);

        void signal_legendTitleFontFamilyChanged(const QString& fontFamily);
        void signal_legendTitleFontSizeChanged(int fontSize);

        void signal_showHideItemActor(QStandardItem* item);

        /// @brief 获取侧边栏曲线数据来源
        /// @param dataSource 传出时为点击选中item的text，返回时为数据来源
        void signal_getSidebarCurveDataSource(QStandardItem* item, QString& dataSource);

        void signal_removeSelectedGraph();
        void signal_copySelectedGraph();
        void signal_deleteAllCurve();
        void signal_renameGraph();
        void signal_renameFinished(QString name);
    public slots:
        void slot_variableAxisChanged(int index);
        void slot_secondVariableAxisChanged(int index);
        void slot_curveNameClicked();
        void slot_curveNameCheckStateChanged(QStandardItem* item);
        void slot_updateCurveData();
        void slot_resultValueDataChanged(int index);
        void slot_checkBoxNormalizeClicked();
        void slot_checkBoxDBClicked();
        void slot_xAxisRangeChange(double minValue, double maxValue);
        void slot_yAxisRangeChange(double minValue, double maxValue);
        void on_pushButton_FormulaEditor_clicked();

        void on_radioButton_Amplitude_clicked();     // 幅度
        void on_radioButton_Phase_clicked();         // 相位
        void on_radioButton_RealPart_clicked();      // 实部
        void on_radioButton_ImaginaryPart_clicked(); // 虚部

        void slot_showContextMenu(const QPoint& pos);
        void slot_fixedValueChanged();
        void slot_ComplexPartsClicked();
        void slot_removeSelectedGraph();
        void slot_renameFinished();
    private:
        /// @brief 选项卡视图组件
        // QTabWidget* m_tabWidget{ nullptr };
        /// @brief 已经添加过的曲线数目
        int m_curveCount{0};

    private:
        Ui::TwoDHeatMapSettings* ui;
        /// =============UI组件=============
        /// 第一页内容
        QWidget* m_page1CentralWidget;
        QWidget* m_page2CentralWidget;
        // QListView* m_curveNameListView;            //曲线列表视图
        // QListView* m_variableValueListView;        //变量值列表视图
        // QGridLayout* _fixedValueLayoutH;             //固定值控件布局
        int _titleFontSize;
        int _contentWidth;
        int m_variableValueIndex;                                       // 当前的变量轴值index
        QList<QPair<QString, QList<QString>>> m_FixedVariableValueList; // 所有数据key
        // QVBoxLayout* _page1Layout;
        QList<QPair<QWidget*, QWidget*>> m_currentFixedValueWidgets; // 当前固定值区域存储的所有控件
        // QComboBox* m_categryValue;                                     //类别下拉框
        QList<QString> m_categoryValueList; // 分类value

        QGridLayout* _page2Layout;
        int page2RowCount;

        QLineEdit* _titleHEditX;
        QComboBox* _fontFamilyComboBoxX;
        QSpinBox* _fontSizeInputX;
        QDoubleSpinBox* _minInputX;
        QDoubleSpinBox* _maxInputX;
        QComboBox* _stepComboBoxX;
        QDoubleSpinBox* _setpInputX;

        QLineEdit* _titleHEditY;
        QComboBox* _fontFamilyComboBoxY;
        QSpinBox* _fontSizeInputY;
        QDoubleSpinBox* _minInputY;
        QDoubleSpinBox* _maxInputY;
        QComboBox* _stepComboBoxY;
        QDoubleSpinBox* _setpInputY;

        // 变量轴UI
        // QLabel* m_variableAxisText;
        // QComboBox* m_variableAxisValue;            //变量轴的下拉框
        QString m_lastVariableAxisText;
        QString m_lastSecondVariableAxisText;
        bool m_isAddCurve{false};       // 用于重新将变量轴设置回去，并且不触发产生新曲线
        bool m_isSecondAddCurve{false}; // 用于重新将变量轴设置回去，并且不触发产生新曲线

        // 固定值区域
        // QLabel* _fixedValueText;
        // QWidget* _fixedValueArea;

        // value UI 结果数据
        // QLabel* m_valueText;
        // QComboBox* m_valueDataValue;            //变量轴的下拉框

        // QCheckBox* _checkBoxNormalize;
        // QCheckBox* _checkBoxDB;

        QList<QComboBox*> m_fixedCombo; // 固定值的所有下拉框

        QComboBox* _legendFontFamilySelector;
        QComboBox* _legendFontSizeSelector;
        // 当前面板显示的数据
        Info2DPointer m_currentTempInfo;
        QTabWidget* m_tabSetting;
        int m_mainWindowId;
        int m_windowUniversalID{-1};
        QVector<bool> m_enableStatus;
        bool m_isAnimationState{ false };
    };
} // namespace pst

#endif // !PST_TWODHEATMAPSETTINGS_H
